#!/bin/sh
#
# Name:      set_install_name
# Purpose:   set install_name for wx shared libraries under Mac OS X
# Usage:     run with --help option to see the instructions
# Copyright: (c) 2005 Vadim Zeitlin <vadim@wxwindows.org>
# Licence:   wxWindows licence
################################################################################

quiet=0
verbose=0
libdir=
tool_prefix=
install_path=
cmd=

Usage()
{
    name=`basename $0`
    cat 1>&2 <<EOF
Usage: $name [OPTIONS] [--prefix=PFX] [--libdir=DIR] [install_path]

Change the install name of all wxWidgets libraries in the directory DIR (or
current directory if libdir option is not specified) to correspond to the given
install_path (defaults to the libraries directory if not specified).

If prefix option is given, its value is prefixed to the tool names used. E.g.
to use this script when cross-building, use "--prefix=powerpc-apple-darwin8-".

    -n, --dry-run       Don't really do anything, just print the commands
    -q, --quiet         Don't display any non error messages
    -v, --verbose       Just show the commands being executed, don't run them
    -h, --help          Show this help screen and exit

Examples:
 * do "$name --libdir=MyApp.app/Contents/Frameworks @executable_path/../Frameworks"
   when distributing wxWidgets shared libraries with application MyApp
 * run "$name" without parameters in the directory containing wxWidgets libraries
   to use them without installing
EOF
    exit 2
}

Message()
{
    if [ $quiet != 1 ]; then
        echo "$*"
    fi
}

VerboseMessage()
{
    if [ $verbose = 1 ]; then
        Message "$*"
    fi
}

Error()
{
    echo "$*" 1>&2
}

GiveUsageErrorAndExit()
{
    Error "$@"
    Usage
}

ChangeInstallNames()
{
    # only change the libs themselves, not symlinks to them
    all_libs=`find "$libdir" -type f -name libwx_\*.dylib`
    if [ -z "$all_libs" ]; then
        Error "No wx libraries found in \"$libdir\"."
        exit 1
    fi

    VerboseMessage "Processing $all_libs\n"

    for lib in $all_libs; do
        libname=`basename $lib`
        oldname=`${tool_prefix}otool -D $lib | tail -1`
        Message "Updating install name of and references to $libname:"
        for lib2 in $all_libs; do
            VerboseMessage "    updating $lib2"
            eval "$cmd ${tool_prefix}install_name_tool -change "$oldname" $install_path/$libname $lib2"
        done
        VerboseMessage "    updating $libname id"
        eval "$cmd ${tool_prefix}install_name_tool -id $install_path/$libname $lib"
    done
}

while [ $# -ge 1 ]; do
    case "$1" in
        --help|-h)
            Usage
            ;;

        --dry-run|-n)
            cmd="echo"
            ;;

        --quiet|-q)
            quiet=1
            ;;

        --verbose|-v)
            verbose=1
            ;;

        --libdir=*)
            if [ -n "$libdir" ]; then
                GiveUsageErrorAndExit "Multiple --libdir options not allowed."
            fi
            libdir=`echo $1 | cut -c10-`
            ;;

        --prefix=*)
            if [ -n "$tool_prefix" ]; then
                GiveUsageErrorAndExit "At most one --prefix option can be given."
            fi
            tool_prefix=`echo $1 | cut -c10-`
            ;;

        -*)
            GiveUsageErrorAndExit "Unknown option \"$1\"."
            ;;

        *)
            if [ -n "$install_path" ]; then
                GiveUsageErrorAndExit "Too many parameters."
            fi
            install_path=$1
    esac

    shift
done

if [ -z $libdir ]; then
    libdir=`pwd`
fi

if [ -z $install_path ]; then
    install_path=$libdir
fi

ChangeInstallNames

exit 0
